/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import java.util.List;
import model.util.HibernateUtil;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author nv_ca@live.com
 */
public class AbstractQuery {

    /**
     * Thêm một đối tượng vào CSDL.
     */
    private static final int INSERT_OBJECT = 1;
    
    /**
     * Chỉnh sửa một đối tượng.
     */
    private static final int UPDATE_OBJECT = 2;
    
    /**
     * Xóa một đối tượng.
     */
    private static final int DELETE_OBJECT = 3;
    
    /**
     * Load một bảng theo một điều kiện nào đó trong câu query
     *
     * @param hQuery câu query theo ngôn ngữ hibernate
     * @return một list chứa các dòng của bảng cần lấy lên. Một dòng là 1 đối
     * tượng trong list.
     */
    public static final List loadObject(String hQuery) { // hQuery is hibernate query
        Transaction trans;
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        trans = session.beginTransaction();
        Query query = session.createQuery(hQuery);
        List resultList = query.list();
        trans.commit();// commit and close transaction
        session.close();// close session, IMPORTANT HERE: NẾU không có session.close(), thì khi KhachHangDAO.backupKhachHang() sẽ xảy ra lỗi "Illegal attempt to associate a collection with two open sessions".
        return resultList;
    }

    /**
     * Phương thức tổng quát cho các trường hợp INSERT, UPDATE, DELETE
     * @param type kiểu thao tác
     */
    public static final void modifyObject(int type, Object o) {
        Transaction trans;
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        trans = session.beginTransaction();
        switch (type) {
            case INSERT_OBJECT:
                session.save(o);
                break;
            case UPDATE_OBJECT:
                session.update(o);
                break;
            case DELETE_OBJECT:
                session.delete(o);
                break;
        }
        trans.commit(); // commit and close transaction
        session.close(); // close session
    }
    
    /**
     * INSERT một đối tượng xuống cơ sở dữ liệu
     *
     * @param o đối tượng sẽ được lưu xuống cơ sở dữ liệu
     */
    public static final void insertObject(Object o) {
        modifyObject(INSERT_OBJECT, o);
    }
    
    /**
     * UPDATE một đối tượng đã được chỉnh sửa
     * @param o đối tượng đã được chỉnh sửa
     */
    public static final void updateObject(Object o) {
        modifyObject(UPDATE_OBJECT, o);
    }
    
    /**
     * DELETE một đối tượng 
     * @param o đối tượng sẽ bị xóa VĨNH VIỄN khỏi CSDL.
     */
    public static final void deleteObject(Object o) {
        modifyObject(DELETE_OBJECT, o);
    }
    
    
}
